distinctUntilChanged
就是我們今天要介紹的好幫手,趕緊來看一看!☕
圖片來源-RxJS官網: distinctUntilChanged
default是
undefined
: 也就是說,可以不需要任何參數,系統會預設比對資料(previous, current)=>boolean
: 提供比對的函式,為true時則自動過濾掉
如果資料來源是一個
object
,可以提供key
來擷取資料
雖然是一個不錯的方式,但RxJS
提供一個更方便的方法,叫做distinctUntilKeyChanged
import { from, distinctUntilChanged } from 'rxjs';
const source$ = from([1, 1, 2, 3, 3, 3, 4, 3]); // <-- 依序印出 1, 1, 2, 3, 3, 3, 4, 3
console.log('=== source ===');
source$.subscribe(console.log);
console.log('=== use distinctUntilChanged ===');
const dist$ = source$.pipe(distinctUntilChanged()); // <-- 自動比對每個數字,過濾掉重複的
dist$.subscribe(console.log);
// 印出
// 1
// 2
// 3
// 4
// 3
distinctUntilChanged()
自動比對每個數字,一旦重複自動過濾掉,是不是很方便阿!...
const source$ = from([1, '1', 2, 3, 3, 3, 4, 3]); // <-- 依序印出 1, 1, 2, 3, 3, 3, 4, 3
// ^^^
// 加入字串
...
previous: 1 , 格式number
current: '1', 格式string
兩者不同格式,自然比對為false
,故不會被過濾掉囉!
Object Array
,並過濾掉重複的名字,先來看看不加入任何參數會發生什麼情形import { from, distinctUntilChanged, map, distinctUntilKeyChanged } from 'rxjs';
const source$ = from([
{ name: 'One', age: 20 },
{ name: 'One', age: 30 },
{ name: 'One', age: 40 },
]);
console.log('=== use distinctUntilChanged ===');
const dist$ = source$.pipe(
distinctUntilChanged() //<-- 每個資料都印出來了
);
dist$.subscribe(console.log);
Array
裡每個Object
都是獨一無二的記憶體位置,自然都為false
,所以資料都會被輸出。key
裡面的值,並做比對,此時,第一個參數就可以拿來設定我們的條件函示。...
const dist$ = source$.pipe(
//distinctUntilChanged() //<-- 每個資料都印出來了
distinctUntilChanged((prev, current) => prev.name === current.name)//<--直接比對key的value
);
...
current>prev
來觀察看看輸出的情形!import { from, distinctUntilChanged, tap } from 'rxjs';
console.log('=== case2-1 use distinctUntilChanged with diff condition===');
const source$ = from([21, 22, 30, 21, 35, 18]);
const dist$ = source$.pipe(
tap(console.log),
distinctUntilChanged((prev, current) => {
console.log(`check prev:${prev}, current:${current}:`, current > prev);
return current > prev;
})
);
dist$.subscribe({ next: (val) => console.log('===>', val) });
21, 21, 18
!!??distinctUntilChanged
主要是 比對current
與prev
是否一致:如果一致代表
true
,就將值剔除;如果false
,將值輸出
如果一致代表true
,就將值剔除;如果false
,將值輸出
如果一致代表true
,就將值剔除;如果false
,將值輸出
寫法1: 還記得第二個參數吧,如果你想直接針對key value
進行比對,可以將第一個參數設定為undefined
,設定第二個值讓他找到指定的key
來做比對,不過...我認為這樣的寫法不夠直覺方便,因此我並不推薦這樣的方法。
✍ 使用distinctUntilKeyChanged(key)
更直覺,比對一下兩個寫法,就知道哪個勝出啦!☕
...
const dist$ = source$.pipe(
// distinctUntilChanged(undefined, (d) => d.name) //<--寫法(1)
distinctUntilKeyChanged('name') //<-- good to use!! //<-- 寫法(2)
);
...
distinctUntilChanged()
: 過濾重複的值,給出不一樣的值。distinctUntilChanged((previous, current)=>boolean)
:比對current
及previous
的值是否一樣:
true
一樣則剔除false
不一樣則輸出 <-- 注意是false
喔!!
distinctUntilKeyChanged
: 取key value
來比對
第21天
再度輕鬆搞定,還剩9天,目標清楚,繼續邁進!Go~~~